﻿//
// Copyright (c) 2011 David Díaz & Fran Pedreira
//
// This file is part of PlanSim.
//
// PlanSim is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// PlanSim is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with PlanSim. If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using PlanSim.Core;

namespace PlanSim.Interfaz
{
    public partial class FormProceso : Form
    {
        Configuracion.Proceso proceso;
       
        String nameEditing = "";

        /// <summary>
        /// Variable que nos indica si añadimos o editamos un proceso, ya que el 
        /// formulario es el mismo.
        /// </summary>
        public int mode;
        public FormProceso(Configuracion.Proceso proc)
        {
            InitializeComponent();
            proceso = proc;
        }
        


        private void bADDES_Click(object sender, EventArgs e)
        {
            
        }

        private void bColor_Click(object sender, EventArgs e)
        {
            if (cDialog.ShowDialog(this)==DialogResult.OK)
            {
                pColor.BackColor = cDialog.Color;
            };
        }

        private void SoloNumeros_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar) || Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        /// <summary>
        /// Devuelve un color aleatorio
        /// </summary>
        /// <returns></returns>
        private static Random randomSeed = new Random();
        public static System.Drawing.Color RandomColor()
        {
            return System.Drawing.Color.FromArgb(
                randomSeed.Next(256),
                randomSeed.Next(256),
                randomSeed.Next(256)
            );
        }

        private void FormProceso_Load(object sender, EventArgs e)
        {


            FormWizard form = (this.Owner as FormWizard); 
            
            
            if (form.lvColas.Items.Count > 0)
            {
                cbColaInicial.BeginUpdate();
                
                for (int i = 0; i < form.lvColas.Items.Count; i++)
                {
                    cbColaInicial.Items.Add(form.lvColas.Items[i].Text);

                }
                cbColaInicial.SelectedIndex=0;
                cbColaInicial.EndUpdate();
            }

            if (mode == 0)
            {
                pColor.BackColor = RandomColor();
            }
            else 
            {
                nameEditing = proceso.Nombre;
                int j = 0;
                while (j < form.lvColas.Items.Count)
                {
                    
                    if (proceso.ColaInicial == form.lvColas.Items[j].Text)
                    {
                       
                        cbColaInicial.SelectedIndex = j;
                        j = form.lvColas.Items.Count;
                    }
                    else
                    {
                        j++;
                    }
                }

                for (int i = 0; i < proceso.AccesosADispositivos.Count; i++)
                {
                    ListViewItem item1 = new ListViewItem(proceso.AccesosADispositivos[i].Nombre, 0);
                    
                    item1.SubItems.Add(proceso.AccesosADispositivos[i].Dispositivo);
                    item1.SubItems.Add(proceso.AccesosADispositivos[i].Periodo.ToString());
                    item1.SubItems.Add(proceso.AccesosADispositivos[i].Duracion.ToString());
                    if (proceso.AccesosADispositivos[i].Ciclico)
                    {
                        item1.SubItems.Add("Si");
                    }
                    else
                    {
                        item1.SubItems.Add("No");
                    }
                    lvADis.Items.Add(item1);
                }
            }
          
            
        }

        private void bOk_Click(object sender, EventArgs e)
        {
            if (validaFormulario())
            {
                this.DialogResult = DialogResult.OK;
                Close();
            }
        }

        private bool validaFormulario()
        {
             if (!validaTexto(tNomProceso.Text))
            {
                MessageBox.Show("Tiene que indicar un nombre correcto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                tNomProceso.Focus();
                 return (false);
                
            }
            else if (buscaRepetidos())
            {
                MessageBox.Show("El nombre ya existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return (false);
            }

             if (!validaEntrada(tEntrada.Text))
             {
                 MessageBox.Show("El formato para el instante de entrada del proceso introducido, no es válido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 tEntrada.Focus();
                 return (false);
             }

             if (!validaNumero(tTCPU.Text))
             {
                 MessageBox.Show("El formato de la duración del proceso introducida, no es válido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 tTCPU.Focus();
                 return (false);
             }
             if (cbColaInicial.Text.Length == 0)
             {
                 MessageBox.Show("Tiene que indicar la cola inicial para este proceso", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 cbColaInicial.Focus();
                 return (false);
                 
             }



            proceso.Nombre = tNomProceso.Text;
            proceso.Entrada = Int32.Parse(tEntrada.Text);
            proceso.Duracion = Int32.Parse(tTCPU.Text);
            proceso.ColaInicial = cbColaInicial.Text;
            proceso.Color = pColor.BackColor.ToArgb();
            
            
            return (true);
        }

        private bool validaEntrada(string s)
        {
            bool auxReturn = false;
            string expresion = @"^[0-9][0-9]*";

            if (Regex.IsMatch(s, expresion, RegexOptions.None))
            {
                if (Regex.Replace(s, expresion, String.Empty).Length == 0)
                {
                    auxReturn = true;
                }
            }
            return (auxReturn);
        }

        private bool validaNumero(string s)
        {
            bool auxReturn = false;
            string expresion = @"^[1-9][0-9]*";

            if (Regex.IsMatch(s, expresion, RegexOptions.None))
            {
                if (Regex.Replace(s, expresion, String.Empty).Length == 0)
                {
                    auxReturn = true;
                }
            }
            return (auxReturn);
        }

        private bool validaTexto(string s)
        {
            bool auxReturn = false;
            string expresion = @"^[A-Za-z][0-9A-Za-z]*";

            if (Regex.IsMatch(s, expresion, RegexOptions.None))
            {
                if (Regex.Replace(s, expresion, String.Empty).Length == 0)
                {
                    auxReturn = true;
                }
            }
            return (auxReturn);
        }

        private bool buscaRepetidos()
        {
            bool auxReturn = false;
            FormWizard form = (this.Owner as FormWizard);
            int i = 0;
            while (i < form.lvProcesos.Items.Count)
            {

                if ((tNomProceso.Text == form.lvProcesos.Items[i].Text) && (nameEditing != tNomProceso.Text))
                {
                    auxReturn = true;
                    i = form.lvProcesos.Items.Count;
                }
                else
                {
                    i++;
                }
            }

            return (auxReturn);
        }

        private bool procesosRepetidos(Configuracion.Proceso p)
        {
            
            if (p.Nombre == this.tNomProceso.Text)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        private void bDelES_Click(object sender, EventArgs e)
        {

        }

        private void toolStripButton8_Click(object sender, EventArgs e)
        {
            if (proceso.AccesosADispositivos.Count > 0)
            {
                MessageBox.Show("Esta versión solo admite un acceso a dispositivo", "Informacón", MessageBoxButtons.OK, MessageBoxIcon.Information);
            
            }
            else
            {
                Configuracion.AccesoADispositivo accDisp = new Configuracion.AccesoADispositivo();
                FormUsoRecurso form = new FormUsoRecurso(accDisp);
                form.Owner = this.Owner;
                form.Text = "Nuevo acceso a dispositivo";
                form.mode = 0;
                if (form.ShowDialog() == DialogResult.OK)
                {
                    ListViewItem item1 = new ListViewItem(form.tNombre.Text, 0);
                    item1.SubItems.Add(form.cbDispositivo.Text);
                    item1.SubItems.Add(form.tInicio.Text);
                    item1.SubItems.Add(form.tDuracion.Text);
                    if (form.cbCiclico.Checked)
                    {
                        item1.SubItems.Add("Si");
                        item1.SubItems.Add(form.tCiclo.Text);
                    }
                    else
                    {
                        item1.SubItems.Add("No");
                    }
                    lvADis.Items.Add(item1);

                    proceso.AccesosADispositivos.Add(accDisp);

                }
                form.Dispose();
            }
            


        }

        private void toolStripButton9_Click(object sender, EventArgs e)
        {
            if (lvADis.SelectedItems.Count > 0)
            {
                ListView.SelectedIndexCollection indexes = lvADis.SelectedIndices;
                foreach (int index in indexes)
                {
                    lvADis.Items.RemoveAt(index);
                    proceso.AccesosADispositivos.RemoveAt(index);
                }
            }
        }

        private void tsbEditProc_Click(object sender, EventArgs e)
        {
            editarAccesoADispositivo();
        }

        private void lvADis_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            editarAccesoADispositivo();
        }

        private void editarAccesoADispositivo()
        {
            if (1 == lvADis.SelectedItems.Count)
            {
                ListViewItem item = lvADis.SelectedItems[0];

                //Configuracion.AccesoADispositivo accDisp = new Configuracion.AccesoADispositivo();
                
                FormUsoRecurso form = new FormUsoRecurso(proceso.AccesosADispositivos[item.Index]);
                form.Owner = this.Owner;
                form.Text = "Editando acceso a dispositivo";
                form.mode = 2;
                form.tNombre.Text = item.Text;
                form.tInicio.Text = item.SubItems[2].Text;
                form.tDuracion.Text = item.SubItems[3].Text;
                if (form.ShowDialog() == DialogResult.OK)
                {
                    item.Text = form.tNombre.Text;
                    item.SubItems[1].Text = form.cbDispositivo.Text;
                    item.SubItems[2].Text = form.tInicio.Text;
                    item.SubItems[3].Text = form.tDuracion.Text;
                    if (form.cbCiclico.Checked)
                    {
                        item.SubItems[4].Text = "Si";
                        
                    }
                    else
                    {
                        item.SubItems[4].Text = "No";
                        
                    }


                }
                form.Dispose();
                item.Selected = true;
            }
        }
 
    }
}
